#ifndef _SERIALIZEMANAGER_H_
#define _SERIALIZEMANAGER_H_


#include "serializeLib_global.h"
#include "ShapeFactory.h"
#include "ShapePacker.h"
#include "Sington.h"
#include <fstream>
#include <QString>
#include <string>

using std::fstream;
using std::ios;
using std::string;

using namespace PROTO;

class SERIALIZEMANAGER_EXPORT SerializeManager
{
private:
    ShapeFactory shapeFactory;
    ShapePacker shapePacker;

public:
	SerializeManager() = default;
	~SerializeManager() = default;

    Shape getARect(int x, int y, int h, int w);
    Shape getACircle(int x, int y, int h, int w);
    Shape getABackout();
    Shape getAClear();

    /**
     * @brief 将ShapeSet保存为文件
     * @author DYL
     * @param sets 需要保存的ShapeSet指针
     * @param path 文件路径
     * @return 是否成功
     */
    bool saveToFile(ShapeSet* sets, QString& path);

    /**
     * @brief 将文件解析为ShapeSet
     * @author DYL
     * @param sets
     * @param path
     * @return 是否成功
     */
    bool parseFromFile(ShapeSet* sets, QString& path);

    /**
     * @brief  可以将Canvas画出来的图像保存为下来，用栈的形式(QVector模拟栈用法)
     *         这个方法可以将栈中的数据是序列化成ShapeSet，然后保存为文件
     * @author DYL
     * @param sets Shape数组
     * @param path 文件路径
     */
    bool saveToFile(QVector<Shape>& sets, QString& path);


    /**
     * @brief  可以从文件解析出ShapeSet
     *         然后填充进QVector<>，后续可以用这个数组还原Canvas的样子
     * @author DYL
     * @param sets Shape数组
     * @param path 文件路径
     */
    bool parseFromFile(QVector<Shape>& sets, QString& path);

    /**
     * @brief 将Canvas的操作栈(保存的图像信息)，序列化成ShapeSet
     * @author DYL
     * @param sets 需要填充的ShapeSet对象
     * @param vec  Canvas操作栈
     */
    void packToShapeSet(ShapeSet* sets, QVector<Shape>& vec);

    /**
     * @brief 将ShapeSet中的Shape信息，拆出按顺序保存到QVector中
     * @author DYL
     * @param sets 需要解包的ShapeSet
     * @param vec  用来保存的数组
     */
    void depackFromShapeSet(ShapeSet* sets, QVector<Shape>& vec);

    static SerializeManager* instance();
};

#endif // !_SERIALIZEMANAGER_H_

